package ec.linde.persistencia.entidades.proyectos;

import static javax.persistence.GenerationType.IDENTITY;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeMap;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import ec.linde.persistencia.entidades.ProdConceptos;
import ec.linde.persistencia.entidades.ProdPartidaDetalle;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/09/2014
 * @author: Alex Carrillo
 * @FechaModificacion: 29/09/2014
 * @author: Alex Carrillo
 * @version: 1.0
 */
@Entity
@Table(name = "prod_detalle_plan_oper", schema = "productividad")
public class DetallePlanOperativo extends EntidadBase {

	private static final long serialVersionUID = 3935545106378163867L;

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "dplo_id", unique = true, nullable = false)
	private int idDetallePlanOperativo;

	@OrderBy("padeNombre ASC")
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "pade_id", nullable = false)
	private ProdPartidaDetalle partida;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "conc_id", nullable = false)
	private ProdConceptos concepto;

	@Column(name = "dplo_costo_unitario", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal costoUnitario = BigDecimal.ZERO;

	@Column(name = "dplo_cantidad", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal cantidad = BigDecimal.ZERO;

	@Column(name = "dplo_costo_tarea", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal costoTarea = BigDecimal.ZERO;

	@Column(name = "dplo_peso", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal peso = BigDecimal.ZERO;

	@Column(name = "dplo_descripcion", nullable = true, length = 200)
	@Size(max = 200)
	private String descripcion;

	@Temporal(TemporalType.DATE)
	@Column(name = "dplo_fecha_inicio", nullable = false)
	@NotNull
	private Date fechaInicio;

	@Temporal(TemporalType.DATE)
	@Column(name = "dplo_fecha_fin", nullable = false)
	@NotNull
	private Date fechaFin;

	@Column(name = "dplo_dias_tarea", nullable = false)
	@NotNull
	@Min(0)
	private int diasTarea = 0;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "plop_id", nullable = true)
	private PlanOperativo planOperativo;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "detallePlanOperativo")
	List<CronogramaPlanOperativo> listaCronogramaPlanOperativo = new ArrayList<CronogramaPlanOperativo>();

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.entities.EntidadBase#getId()
	 */
	@Override
	public int getId() {
		return this.idDetallePlanOperativo;
	}

	public int getIdDetallePlanOperativo() {
		return idDetallePlanOperativo;
	}

	public void setIdDetallePlanOperativo(int idDetallePlanOperativo) {
		this.idDetallePlanOperativo = idDetallePlanOperativo;
	}

	public ProdConceptos getConcepto() {
		return concepto;
	}

	public void setConcepto(ProdConceptos concepto) {
		this.concepto = concepto;
	}

	public BigDecimal getCostoUnitario() {
		return costoUnitario;
	}

	public void setCostoUnitario(BigDecimal costoUnitario) {
		this.costoUnitario = costoUnitario;
	}

	public BigDecimal getCantidad() {
		return cantidad;
	}

	public void setCantidad(BigDecimal cantidad) {
		this.cantidad = cantidad;
	}

	public BigDecimal getCostoTarea() {
		return costoTarea;
	}

	public void setCostoTarea(BigDecimal costoTarea) {
		this.costoTarea = costoTarea;
	}

	public BigDecimal getPeso() {
		return peso;
	}

	public void setPeso(BigDecimal peso) {
		this.peso = peso;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public int getDiasTarea() {
		return diasTarea;
	}

	public void setDiasTarea(int diasTarea) {
		this.diasTarea = diasTarea;
	}

	public PlanOperativo getPlanOperativo() {
		return planOperativo;
	}

	public void setPlanOperativo(PlanOperativo planOperativo) {
		this.planOperativo = planOperativo;
	}

	/**
	 * Get del atributo partida
	 * 
	 * @return el valor del atributo partida
	 */
	public ProdPartidaDetalle getPartida() {
		return partida;
	}

	/**
	 * Set del atributo partida
	 * 
	 * @param partida
	 *            valor para asignar al atributo partida
	 */
	public void setPartida(ProdPartidaDetalle partida) {
		this.partida = partida;
	}

	public List<CronogramaPlanOperativo> getListaCronogramaPlanOperativo() {
		return listaCronogramaPlanOperativo;
	}

	public void setListaCronogramaPlanOperativo(List<CronogramaPlanOperativo> listaCronogramaPlanOperativo) {
		this.listaCronogramaPlanOperativo = listaCronogramaPlanOperativo;
	}

	public List<CronogramaPlanOperativo> getListaCronogramaPlanOperativoListado() {
		List<CronogramaPlanOperativo> lista = new ArrayList<CronogramaPlanOperativo>();
		for (CronogramaPlanOperativo cronogramaPlanOperativo : listaCronogramaPlanOperativo) {
			if (!cronogramaPlanOperativo.isEliminado()) {
				lista.add(cronogramaPlanOperativo);
			}
		}
		return lista;
	}

	public BigDecimal getTotalAvanceCronograma() {
		BigDecimal total = BigDecimal.ZERO;
		for (CronogramaPlanOperativo cronogramaPlanOperativo : listaCronogramaPlanOperativo) {
			if (!cronogramaPlanOperativo.isEliminado()) {
				total = total.add(cronogramaPlanOperativo.getAvance());
			}
		}
		return total;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.persistencia.entidades.EntidadBase#setEliminado(boolean)
	 */
	@Override
	public void setEliminado(boolean eliminado) {
		for (CronogramaPlanOperativo cronogramaPlanOperativo : listaCronogramaPlanOperativo) {
			cronogramaPlanOperativo.setEliminado(eliminado);
		}
		super.setEliminado(eliminado);
	}

	public TreeMap<Date, CronogramaPlanOperativo> getTmCronogramaPlanOperativo() {
		TreeMap<Date, CronogramaPlanOperativo> tmFecha = new TreeMap<Date, CronogramaPlanOperativo>();
		for (CronogramaPlanOperativo cronogramaPlanOperativo : listaCronogramaPlanOperativo) {
			if (!cronogramaPlanOperativo.isEliminado() && !cronogramaPlanOperativo.isDiaNoLaborable()
					&& !tmFecha.containsKey(cronogramaPlanOperativo.getFecha())) {
				tmFecha.put(cronogramaPlanOperativo.getFecha(), cronogramaPlanOperativo);
			}
		}
		return tmFecha;
	}

}
